如今,物联网的发展早已是大势所趋,市场上出现了形形色色的物联网产品,但大多产品的功能简单,对日常生活及工作效率的推动鲜有实际意义。“云”更是时下正受热捧的新鲜技术。而AI(即人工智能)又是科技界中最有发展前景的领域之一,但却很少投入民用。《钢铁侠》系列中斯塔克的人工智能程序贾维斯更是给予了我灵感,于是,作为一个对未来科技的狂热者,脑海中产生了自制一个将AI技术云技术与物联网技术无缝结合的智能控制装置的想法。可能功能和执行力上不可能达到贾维斯那般强大的境界,但是却能够利用我所掌握的单片机技术及软件算法,真正改变人们的生活方式,使一切的控制变得简单智能,从而推进日常的执行效率乃至运用在企业以推进生产力。
而经过不懈的努力开发,此终端也逐渐成型,它将人工AI技术、云技术、物联网技术三大新技术合为一体,主要创新点及功能有:①云端储存及控制 ②云日程表 ③云书架④家电物联⑤智能AI⑥AI会变得越来越了解使用者⑦两种身份验证方式。
本篇论文,通过对装置各个部件的运行原理和软件部分的细节功能的描述,详细介绍了一种基于人工AI及云端的人机交互式私人智能控制终端的设计与实现。
关键词:云技术;物联网技术;人工智能(AI);Arduino ;一体化控制;NFC;TFT3.2;安卓App;
目录 3
1 引言 4
1.1 项目由来 4
1.2 研究背景 4
1.2(1) 物联网技术的深远意义及应用前景 4
1.2(2) 云技术的四大好处 5
1.2(3) AI的实现方法 5
1.2(4) 总结 6
1.3 研究内容 6
2 装置功能总体介绍 7
2.1 云端储存及控制 7
2.2 云日程表 7
2.3 云书架 7
2.4 家电物联 7
2.5 智能AI 7
2.6 AI会变得越来越了解使用者! 7
2.7 两种身份验证方式 7
3 装置结构介绍及说明 8
3.1 装置分部与外部结构 8
3.2 各部分功能介绍&&技术实现 8
3.2(1) 云端部分 8
3.2(2) 物联网部分 10
3.2(3) AI部分 12
3.2(4) 其他部分 14
3.3 逻辑运行图 15
    图1
4 同类产品比较 16
4.1 与BroadLink的对比测评 16
5 总结 17
5.1 装置总结分析 17
5.2 项目展望 17
5.3 参考文献 17
代码附录:(云端搭建部分) 18
1 引言
本节介绍此项目由来并简单介绍本项目。
1.1项目由来
如今,物联网的发展早已是大势所趋,市场上出现了形形色色的物联网产品,但大多产品的功能简单,对日常生活及工作效率的推动鲜有实际意义。“云”更是时下正受热捧的新鲜技术。而AI(即人工智能)又是科技界中最有发展前景的领域之一,但却很少投入民用。《钢铁侠》系列中斯塔克的人工智能程序贾维斯更是给予了我灵感,于是,作为一个对未来科技的狂热者,脑海中产生了自制一个将AI技术云技术与物联网技术无缝结合的智能控制装置的想法。可能功能和执行力上不可能达到贾维斯那般强大的境界,但是却能够利用我所掌握的单片机技术及软件算法,真正改变人们的生活方式,使一切的控制变得简单智能,从而推进日常的执行效率乃至运用在企业以推进生产力。
1.2 研究背景
本节将描述其研究背景,对物联网技术的深远意义及应用前景、云技术给人们生活各方面带来的促进作用、AI技术的实现方法、进行介绍。主要将以应用各类文献图表的形式体现。
1.2(1) 物联网技术的深远意义及应用前景
今年3月份,工业和信息化部部长苗圩接受媒体采访时表示,互联网解决了人和人之间的信息交互和共享,物联网是要解决更大维度的人和物、物和人、物和物之间的信息交互和共享。工业互联网是物联网重要的组成部分,只不过物联网应用的范围比工业互联网更大。
苗圩表示,工业互联网是顺应新一轮工业革命和产业变革的一个重点发展领域,也是政府工作报告中提到 的“互联网+”最早实现的行业之一。工业互联网有非常大的发展潜力,在现实中有很多企业也注意到应用互联网技术来提高企业的整体竞争能力。据一个国际权威机构估算,在未来20年中,中国工业互联网发展至少可带来三万亿美元左右GDP增量。
我们应该高度重视,积极引导,做好工业互联网的应用和发展。从两个方面切入,实现融合发展。第一个方面,就是前面提到的智能制造。第二个方面,就是把互联网引导工业企业、工业行业中去。互联网发展方面,中国有一批互联网企业成为国际竞争的领跑者。把这些企业发动起来,和工业企业密切融合,搭建好工业互联网发展的框架,就会为企业未来的发展提供更多的机会。据国际权威机构测算,应用工业互联网后,企业的效率会提高大约20%,成本可以下降20%,节能减排可以下降10%左右。
工业和信息化部正在组织论证工业互联网整体的架构。互联网时代是自上而下的架构,工业互联网是自下而上的发展战略,也就是从数据中心怎么建、云服务怎么用、大数据怎么分析这些方面入手,从企业到行业到国家乃至到国际。同时也要趋利避害,既要看到它发展有利的一面,也会给我们带来负面的影响,比如如何保证网络的安全,不被攻击、不被篡改,如何保护用户个人的信息安全。这些方面都还需要研究,趋利避害,为发展做一个更好的谋划。
1.2(2) 云技术的四大好处
1、安全。云计算提供了最可靠、最安全的数据存储中心,用户不用再担心数据丢失、病毒入侵等麻烦。
2、方便。云计算对用户端的设备要求最低,使用起来也最方便。
3、数据共享。云计算可以轻松实现不同设备间的数据与应用共享。
4、无限可能。云计算为我们使用网络提供了几乎无限多的可能。
1.2(3) AI的实现方法
人工智能(Artificial Intelligence)在计算机上实现时有2种不同的方式。一种是采用传统的编程技术,使系统呈现智能的效果,而不考虑所用方法是否与人或动物机体所用的方法相同。这种方法叫工程学方法(ENGINEERING APPROACH),它已在一些领域内作出了成果,如文字识别、电脑下棋等。另一种是模拟法(MODELING APPROACH),它不仅要看效果,还要求实现方法也和人类或生物机体所用的方法相同或相类似。遗传算法(GENERIC ALGORITHM,简称GA)和人工神经网络(ARTIFICIAL NEURAL NETWORK,简称ANN)均属后一类型。遗传算法模拟人类或生物的遗传-进化机制,人工神经网络则是模拟人类或动物大脑中神经细胞的活动方式。为了得到相同智能效果,两种方式通常都可使用。采用前一种方法,需要人工详细规定程序逻辑,如果游戏简单,还是方便的。如果游戏复杂,角色数量和活动空间增加,相应的逻辑就会很复杂(按指数式增长),人工编程就非常繁琐,容易出错。而一旦出错,就必须修改原程序,重新编译、调试,最后为用户提供一个新的版本或提供一个新补丁,非常麻烦。采用后一种方法时,编程者要为每一角色设计一个智能系统(一个模块)来进行控制,这个智能系统(模块)开始什么也不懂,就像初生婴儿那样,但它能够学习,能渐渐地适应环境,应付各种复杂情况。这种系统开始也常犯错误,但它能吸取教训,下一次运行时就可能改正,至少不会永远错下去,用不到发布新版本或打补丁。利用这种方法来实现人工智能,要求编程者具有生物学的思考方法,入门难度大一点。但一旦入了门,就可得到广泛应用。由于这种方法编程时无须对角色的活动规律做详细规定,应用于复杂问题,通常会比前一种方法更省力。
1.2(4) 总结
这三方面技术的任何一方面都有深远意义,也映证了本项目的研究意义。
1.3 研究内容
通过结合云、AI与物联网三方面的技术,研究制造一种真正智能的控制终端,改善生活,提升工作效率、及企业生产力。搭建云端服务器,储存记录使用者各种习惯数据。且作为主机负责物联网中各个部分间的通讯控制及信息交互。利用物联网技术把室内家电连接在一起,一体化控制管理。再用AI技术完成人机交互,负责与使用者的沟通,作为使用者的语音助手接收指令,根据请求完成相应操作,控制各个模块的运行。最终达到给予使用者更便捷的生活方式、提高工作效率及生产力、彻底解放使用者双手的效果。
2 装置功能总体介绍
2.1 云端储存及控制
使用一块Arduino Yun开发板来搭建云端。云端会同步使用者手机中的重要事件以在适当的时候发出提醒,同时从AI那里获取的关于使用者的一切习惯数据都将储存于此。而云端也是整个控制终端的中枢,利用wifi协议控制家中家电。
2.2 云日程表
云端会同步使用者手机中的日程表和重要事项,在适当的时刻通过AI对使用者发出提醒。
2.3 云书架
通过RFID标签来识别使用者放置于此的资料或是书籍,记录其位置,根据云端储存的使用者的课程/日程表来提醒使用者取走相应书籍。
2.4 家电物联
可以直接给AI发出指令,云端接收处理指令与红外模块通讯,控制电视的开关调频、空调的开关调温等。且各个家电的状态也会储存在云端。
2.5 智能AI
人机交互的主要实现形式。能利用语音识别模块与使用者交流接收指令,把接收到的指令交付给云端进行处理分流。
2.6 AI会变得越来越了解使用者!
AI会记录使用者的使用习惯,如若是使用者常把周三设定为有会议的重要事件,则之后的每个周三,其都会对使用者发出相应的提醒。总之,AI会变得越来越了解使用者的生活习惯!当然,使用者可以直接管理云端储存数据以修改删除那些错误的使用者习惯信息。甚至可以选择让AI停止了解自己。
2.7 两种身份验证方式
使用者可选择NFC标签验证或是手机验证,只要手机打开相关APP与云端连接或是在NFC识别模块上进行识别,装置就会验证使用者身份且开机。而在手机与云端连接断开或是使用者再进行一次NFC扫描时,装置便会进入待机状态。仅有NFC模块和云端正常运行。
3 装置结构介绍及说明
主要对本项目设计的装置进行简要的描述以及各组件的功能介绍。
3.1 装置分部与外部结构
终端主体部分与书桌相嵌,为一块方形平台,其中集成有Arduino Yun开发板、语音识别模块、NFC模块、3.5寸LCD彩色显示屏、Arduino mega2560开发板、语音播放模块、扩音器。云书架也就位于此方形平台之上。而红外二极管将作为红外信号的中继器与Arduino nano微型开发板分布在几个不同角落。
3.2 各部分功能介绍&&技术实现
3.2(1) 云端部分
①Arduino Yun开发板:
Arduino Yun是一个基于Atmega32u4和 Ar9331的微控制器。Ar9331运行着一个名为Linino的OpenWrt linux系统。这块控制器带有网络通信和Wifi支持,USB-A端口,Micro-SD插槽,20个输入输出引脚(其中7个可用于PWM输出,12个可用于模拟输入),16 MHz晶振, micro USB接口,ICSP接口,和一个复位按键。
Processing/Wiring开发环境。能通过各种各样的传感器来感知环境,
(Arduino Yun开发板)
本项目中,Arduino Yun主要担任云端服务器与控制中枢的角色,尤其是出于其强大的运算能力,大部分AI及云端数据信息的后台运算都由这块开发板处理。
数据储存方面,主要是使用Google Doc的在线文档与开发板通讯,将使用者使用习惯、重要事件、AI数据等记录在云端。(此段源代码见附录)
(利用google doc编辑管理Arduino Yun数据的界面)
而此开发板的另一重要用途是与使用者的手机进行通讯,当手机端连入Arduino Yun的WIFI环境,云端会识别使用者身份,而之后才会开启整个装置,这也是启动装置的方式之一。同时,云端会同步使用者手机中的日程表、重要事件等数据。
②云书架:
云书架方面,则是利用RFID识别标签识别线圈中的数据,只要书中贴有一小段纸条状的RFID标签,RFID识别模块便可识别书的名称,并可将书或文件的位置储存记录在云端,通过核对使用者的日程表/课程表,若在使用者应该携带此文件/书而却忘了携带时,AI会发出相关提醒。而若是使用者急于寻找某一文件而又忘了其具体位置,只需询问AI,AI会请求云端数据以查找文件位置并反馈给使用者。
3.2(2) 物联网部分
①家电智能控制
使用者可直接通过对AI发出指令的方式,控制家中如电视、空调等可红外控制的设备的开关调温调频等。
其运行过程为,AI接收指令发送给云端,云端在将其发送给位于房间角落的Arduino Nano迷你开发板,Nano接收该指令时,会将其编译成红外信号,由Nano前端的940红外发射管发出相应红外信号以对家电进行控制。
这里使用到的红外发射模块,是基于940红外发射管的红外发射模块,通过发射管发射940nm波长的红外信号,可被几米外的红外接收模块(内链接)获取信号并解调,配合编解码程序即可达到遥控功能。其特点为控制接口电平、供电电源可为5V或3.3V;高电平驱动,所需拉电流小;可按照实际应用需求手动调整发射管方向。
这里选择使用38KHZ的红外来进行控制而并非用WIFI协议直接控制,是因为目前家庭及企业使用的主流家庭电器都不直接支持WIFI信号,虽已有WIFI空调WIFI电视等面世,但离普及仍需一段时日,为确保较大的受众人群,使用了传统的红外信号控制。
但使用红外信号来进行控制的唯一缺点在于需要在开发过程中事先将遥控器每个按键的信号进行接收内录。而实际使用过程中无任何影响。(见下图,为开发过程中的内录操作)
②自适应温度湿度控制空调
这里我使用了一块MLX90614 红外线测温模块,这款红外非接触温度计。(测温方式可分为接触式和非接触式,接触式测温只能测量被测物体与测温传感器达到热平衡后的温度,所以响应时间长,且极易受环境温度的影响;而红外测温是根据被测物体的红外辐射能量来确定物体的温度,不与被测物体接触,具有影响动被测物体温度分布场,温度分辨率高、响应速度快、测温范围广、稳定性好等特点)
TO-39金属封装里同时集成了红外感应热电堆探测器芯片和信号处理专用集成芯片。由于集成了低噪声放大器、17位模数转换器和强大的数字信号处理单元,使得高精度和高分辨度的温度计得以实现。
装置正常运转时,此模块会不断接收周围环境的温度,精度极高(见下图)。当室温过高或者过低时,云端会自动控制空调以相应运行模式开启(制冷/制热)。
(MLX90614 红外线测温模块接收数据)
而同时采用DHT22湿度传感器捕获环境湿度,在特定条件下令空调以除湿模式运转。
3.2(3) 人工AI部分
①AI本体:
AI是人机交互完成的主要形式,也是装置接收指令的最主要的部分。AI的本体实质只是一块LD3320语音识别模块及放音模块,负责接收使用者说出的指令,将其编码后发送给后台的Arduino Yun。也就是说实际上AI的绝大部分运算是由Arduino Yun来完成,前端语音模块只是与使用者交换信息的媒介。
使用者可以与AI直接交流以了解相关信息,也可发出相关指令,如开关电视、空调,搜索书籍或文件位置,甚至还可直接告诉AI在日后某一时刻提醒自己进行某项事件。AI也会主动在适当时刻对使用者发出相关提醒,如云端中储存有使用者A将在1月1日清晨进行某项事件且需携带文件B的信息。AI便会在1月1日清晨给使用者以语音的形式发出提醒。当使用者与云端断开连接,也就是当使用者走出家门/公司时,云端会对云书架进行自检,也就是RFID信号检测,若是仍然搜索到了文件B的RFID信号,也就意味着文件B仍留在书架上,云端会向使用者的手机端APP发送相关警告。(下图为所使用的语音识别模块)
②AI会变得越来越了解你:
AI会将你经常问的问题或是反复设置的重要事件及进行的操作记录下来。如若使用者连续三周让AI在周一的同一时间点打开电视并切换到1频道,则AI会了解到每周的这个时间点1频道有你喜爱看的内容,便会记录下这个细节并把此数据发送给云端储存,之后的每个周一的同一时间点,无需使用者再进行设置,AI会控制电视自动打开。总之会在你与你日复一日的交互中,了解到你越来越多的习惯,并把它们储存在云端。当然,你也可以通过在Google Doc上编辑修改云端数据的方式来修改AI得到的关于你的错误的习惯信息。你甚至可以让AI停止了解你,只需你对AI发出相应语音指令“停止了解我”,后台便会暂时的禁用了解使用者习惯的那段代码。直至再次被使用者激活。
③AI误触发的解决方案
在开发整个AI的过程中,最大的困难在于如何让AI知道使用者这句话是说给自己的,毕竟不可能一直让其识别使用者说的每一句话。经过思考,我决定采用类似于Windows10中Cortana所采用的误触发方案。即“词头激活”,Windows10中,当使用者对着电脑麦克风说出“Hey Cortana”时,Cortana才会被激活,在我的AI中也是如此,只有当使用者对其说出“嘿,小依”(由于使用了洛天依作为调教音源,暂时将AI命名为小依)时,AI才会做出反应,开始接受使用者的话语。而与Cortana不同的一点是,AI会在接收到使用者语音并做出回应后的十秒内,继续等待接收使用者说出的下一句语句,这样就留给使用者足够的反应思考空间。当然,使用者若是无需再和AI互动,可在十秒结束之前通过对其说出“你休息吧”等指令让其提前接收状态,直至下一次被重新激活。
(Win10中Cortana采用的“词头激活”法)
3.2(4) 其他
①TFT3.2寸触摸彩屏
位于终端平台板上,现实监控所得的室内温度、湿度、家电状态等信息,且可进行触控,使用者也可在这块触控屏上搜索文件位置。
(分辨率为320*480的TFT屏)
②NFC模块
NFC负责验证使用者身份,当使用者将NFC标签放在NFC板上,云端会自动识别使用者身份信息,并开启整个终端,这也就是除了使用手机端之外,终端开启的另一方式。
(目前使用的PN532 NFC模块)
3.3 逻辑运行图
4 同类产品比较
与市场上同类型产品对比,突出本终端特点。
4.1 与Broadlink的对比测评
Broadlink无疑是当今物联网界的翘楚,而本次我对比测评的是Broadlink系列中的旗舰产品RM-Pro。正如BLK官方所宣传的那样,它的信号强度的确是强到了令人目瞪口呆的地步,实验室中任何一个角落,甚至是隔墙,控制成功率依旧奇高无比。这也是其强化了433M、315M射频的必然结果。
但它的所有优势,也就可能止步于其信号强度了。在“万能遥控”方面,官方可能是夸大宣传了。在我实际使用“易控”进行测试的过程中,APP内的任何一个按键都无法直接使用,需我手持遥控器,对着其终端让它一个一个键的学习,等学完所有键,手指早就累得不行。我不知此设备在控制新家电时这种情况会不会有所改善,但就传统家电而言,此问题是普遍存在的。也就是说,在当前环境下,此设备的运行原理仅仅是利用wifi把手机与BLK终端连接在一起,终端再发出相应红外或是射频信号,但在使用之前,需拿原遥控器让终端内的红外射频接收模块一个键一个键的接收信号并学习。且在大部分情况下,这个设备对同一类型不同品牌的家电的兼容性并不尽如人意。这可能也是是目前物联网产品的普遍不足。且此产品实质上只用到物联网技术,还没有真正发展为云端控制。
而本项目所制造的终端,不仅仅是简单的物联产品,我将云、AI及物联网三项技术一体化,AI交互,云端储存控制,物联网执行,优势是十分明显的,功能相较目前主流物联网产品也是强大的多。在红外信号方面,由于是后台云端管理信号,很容易建立起数据库从而真正达到“万能遥控”的效果。
5 总结
对成果的总结,分析
5.1 装置总结分析
总体创新点:①云端储存及控制 ②云日程表
③云书架 ④家电物联
⑤智能AI ⑥AI会变得越来越了解使用者
⑦两种身份验证方式
其优点:整个装置功能全,运行准确性高,集云技术、人工智能(AI)技术、物联网技术于一体,是一个一体化的智能控制终端,在实际使用中能有效提高生活工作各方面的效率。操作容易,彻底解放了使用者的双手。
5.2 项目展望
主要是Arduino Yun的联网问题,目前的云端只是利用Arduino Yun作为主机的一个小型服务器,虽确实能利用Arduino Yun的以太网口与英特网进行连接,但目前能做到的只是发送消息给手机端APP而已。而导致目前功能受障的主要原因是基于Linux系统的程序开发与Arduino Yun板的两块不同架构微处理器之间的通讯问题,今后在解决以上两个问题后,可真正使数据库联网,扩大容量,而最重要的是目前的AI将便的更智能,利用网络资源,它将能为使用者做更多事,例如直接替使用者搜索影片档期甚至直接替使用者完成定座操作。
5.3 参考文献
《C程序设计》——谭浩强
《Artificial Intelligence: a Modern Approach, Third Edition》——[美] 罗素Stuart J.Russell,[美] 诺维格Peter Norvig
《Arduino高级开发权威指南》——[美] Steven F.Barrett
《云计算与分布式系统:从并行处理到物联网》——[美] Kai Hwang,[美] Geoffrey C.Fox,[美] Jack J.Dongarra
《玩转Arduino 物联网应用篇》——陶冶,王晓东,刘君
《Android编程权威指南 [Android programming: the big nerd ranch guide]》——[美] Brian Hardy,Bill Phillips
代码附录:(云端搭建部分)
/*
SendDataToGoogleSpreadsheet
Demonstrates appending a row of data to a Google spreadsheet from the Arduino Yun
using the Temboo Arduino Yun SDK.
This example code is in the public domain.
*/
#include 
#include 
#include "TembooAccount.h" // contains Temboo account information
/*** SUBSTITUTE YOUR VALUES BELOW: ***/
// Note that for additional security and reusability, you could
// use #define statements to specify these values in a .h file.
const String GOOGLE_USERNAME = "your-google-username";
const String GOOGLE_PASSWORD = "your-google-password";
// the title of the spreadsheet you want to send data to
// (Note that this must actually be the title of a Google spreadsheet
// that exists in your Google Drive/Docs account, and is configured
// as described above.)
const String SPREADSHEET_TITLE = "your-spreadsheet-title";
const unsigned long RUN_INTERVAL_MILLIS = 60000; // how often to run the Choreo (in milliseconds)
// the last time we ran the Choreo
// (initialized to 60 seconds ago so the
// Choreo is run immediately when we start up)
unsigned long lastRun = (unsigned long)-60000;
void setup() {
// for debugging, wait until a serial console is connected
Serial.begin(9600);
delay(4000);
while(!Serial);
Serial.print("Initializing the bridge...");
Bridge.begin();
Serial.println("Done");
}
void loop()
{
// get the number of milliseconds this sketch has been running
unsigned long now = millis();
// run again if it's been 60 seconds since we last ran
if (now - lastRun >= RUN_INTERVAL_MILLIS) {
// remember 'now' as the last time we ran the choreo
lastRun = now;
Serial.println("Getting sensor value...");
// get the value we want to append to our spreadsheet
unsigned long sensorValue = getSensorValue();
Serial.println("Appending value to spreadsheet...");
// we need a Process object to send a Choreo request to Temboo
TembooChoreo AppendRowChoreo;
// invoke the Temboo client
// NOTE that the client must be reinvoked and repopulated with
// appropriate arguments each time its run() method is called.
AppendRowChoreo.begin();
// set Temboo account credentials
AppendRowChoreo.setAccountName(TEMBOO_ACCOUNT);
AppendRowChoreo.setAppKeyName(TEMBOO_APP_KEY_NAME);
AppendRowChoreo.setAppKey(TEMBOO_APP_KEY);
// identify the Temboo Library choreo to run (Google > Spreadsheets > AppendRow)
AppendRowChoreo.setChoreo("/Library/Google/Spreadsheets/AppendRow");
// set the required Choreo inputs
// see https://www.temboo.com/library/Library/Google/Spr...
// for complete details about the inputs for this Choreo
// your Google username (usually your email address)
AppendRowChoreo.addInput("Username", GOOGLE_USERNAME);
// your Google account password
AppendRowChoreo.addInput("Password", GOOGLE_PASSWORD);
// the title of the spreadsheet you want to append to
AppendRowChoreo.addInput("SpreadsheetTitle", SPREADSHEET_TITLE);
// convert the time and sensor values to a comma separated string
String rowData(now);
rowData += ",";
rowData += sensorValue;
// add the RowData input item
AppendRowChoreo.addInput("RowData", rowData);
// run the Choreo and wait for the results
// The return code (returnCode) will indicate success or failure
unsigned int returnCode = AppendRowChoreo.run();
// return code of zero (0) means success
if (returnCode == 0) {
Serial.println("Success! Appended " + rowData);
Serial.println("");
} else {
// return code of anything other than zero means failure
// read and display any error messages
while (AppendRowChoreo.available()) {
char c = AppendRowChoreo.read();
Serial.print(c);
}
}
AppendRowChoreo.close();
}
}
// this function simulates reading the value of a sensor
unsigned long getSensorValue() {
return analogRead(A0);
}
    图2
    图3
    图4
    图5
    图6
    图7
    图8
    图9
    图10
    图11